package ivansalvadori.diariopushweb.dao.rdb;

import ivansalvadori.diariopushweb.dao.TermoDAO;
import ivansalvadori.diariopushweb.model.Diario;
import ivansalvadori.diariopushweb.model.Termo;
import ivansalvadori.diariopushweb.model.Usuario;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;

public class RDBTermoDAO extends SimpleJdbcDaoSupport implements TermoDAO {

	@Override
	public void inserir(Termo termo) {
		SimpleJdbcInsert insert = new SimpleJdbcInsert(getDataSource());
		insert.setTableName("Termo_Usuario");
		insert.setGeneratedKeyName("codigo");

		// insere um termo para cada diario
		List<Diario> diarios = termo.getDiarios();
		for (Diario diario : diarios) {
			Map<String, Object> parameters = new HashMap<String, Object>(6);
			parameters.put("termo", termo.getTermo());
			parameters.put("codigo_usuario", termo.getUsuario().getCodigo());
			parameters.put("codigo_diario", diario.getCodigo());
			parameters.put("tipo_termo", termo.getTipo());
			insert.execute(parameters);
		}

	}

	@Override
	public List<Termo> listar(Usuario usuario) {
		List<Termo> termos = getJdbcTemplate()
				.query("select t.codigo, t.termo, t.codigo_diario, t.tipo_termo, d.nome_entidade from Termo_Usuario t join Diario d on d.codigo = t.codigo_diario " +
						"where codigo_usuario = ? order by termo",
						new Object[] { usuario.getCodigo() },new RowMapper<Termo>() {
							public Termo mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								Termo termo = new Termo();
								termo.setCodigo(rs.getInt("codigo"));
								termo.setTermo(rs.getString("termo"));
								termo.setTipo(rs.getString("tipo_termo"));

								Diario d = new Diario();
								d.setCodigo(rs.getInt("codigo_diario"));
								d.setEntidade(rs.getString("d.nome_entidade"));
								termo.addDiario(d);

								return termo;
							}
						});

		return termos;
	}

	@Override
	public void remover(int codigo) {
		getJdbcTemplate().update("delete from Termo_Usuario where codigo = ?", new Object[] {new Integer(codigo)});
		
	}

}
